package com.donleo.ssm.service.impl;

import com.donleo.ssm.dao.IUserMapper;
import com.donleo.ssm.model.UserModel;
import com.donleo.ssm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author liangd
 * date 2020-11-17 16:43
 * code
 */
@Service("userService")
public class IUserServiceImpl implements IUserService {

    @Autowired
    private IUserMapper userMapper;

    @Override
    public List<UserModel> findAll() {
        return userMapper.findAll();
    }

    @Override
    public UserModel findById(Integer id) {
        return userMapper.findById(id);
    }

    @Override
    public List<UserModel> findAllBySome(UserModel userModel) {
        return userMapper.findAllBySome(userModel);
    }

    /**
     *  基于注解的方式配置事物
     *  1、用propagation 指定事物传播行为
     *     1）即当前事物方法被另一个事物方法调用时，如何使用事物
     *     默认选择为REQUIRED，即使用调用方法的事物
     *     2）REQUIRES_NEW：事物自己的事物，调用方法的事物被挂起
     *  2、isolation:指定事物的隔离级别
     *     最常用的是READ_COMMITTED
     *  3、默认情况下Spring的声明式事物对所有的运行时异常进行回滚，也可以对相应的属性进行设置
     *     通常情况下取默认值
     *     noRollbackFor = Exception.class  不回滚
     *     rollbackFor=Exception.class  回滚
     *  4、readOnly  只读事物，不更新数据库，可以帮助数据库引擎优化事物
     *  5、timeOut  可以强制回滚事物之前所占的时间，单位以s计
     */
   /* @Transactional(propagation = Propagation.REQUIRES_NEW,
            isolation = Isolation.READ_COMMITTED,
            rollbackFor = Exception.class,
            readOnly = false,
            timeout = 3)*/
    @Override
    public UserModel add(UserModel userModel) {
        try {
            userMapper.add(userModel);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userModel;
    }

    @Override
    public Integer delete(Integer id) {
        return userMapper.delete(id);
    }

    @Override
    public Integer deletes(List<Integer> ids) {
        return userMapper.deletes(ids);
    }

    @Override
    public Integer update(UserModel userModel) {
        return userMapper.update(userModel);
    }
}
